package ezonsport.android.service;

import java.security.MessageDigest;
import java.sql.SQLException;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.j256.ormlite.stmt.QueryBuilder;

import ezonsport.android.core.systemManage.User;
import ezonsport.android.data.DataHelper;
import ezonsport.android.data.OrmliteDataContext;

public class SystemManageService {
	private OrmliteDataContext ctx;

	public SystemManageService(DataHelper dataHelper) {
		ctx = new OrmliteDataContext(dataHelper);
	}

	/**
	 * 用户登录
	 * 
	 * @param userName
	 * @param pwd
	 * @return NULL means login success,other strings means error message.
	 */
	public String login(String userName, String pwd) {

		try {
			String msg = userNameAndPwdCanNotNull(userName, pwd);
			// 用户名和密码都不为空
			if (msg == null) {
				// 查询数据库中是否存在该用户
				QueryBuilder<User, Long> qb = ctx.getQueryBuilder(User.class,
						long.class);
				// 用户以邮箱登录
				if (isEmail(userName)) {
					qb.where().eq("email", userName);
				} else {
					// 用户以昵称登录
					qb.where().eq("nickName", userName);
				}
				List<User> dbUserList = ctx.query(User.class, long.class,
						qb.prepare());
				// 存在该用户
				if (dbUserList.size() != 0) {
					// 因为用户名（邮箱或昵称）是惟一的，所以dbUserList中只有一个对象
					User dbUser = dbUserList.get(0);
					// 如果用户密码也正确，则表示登录成功
					if (md5(pwd).equals(dbUser.getPwd())) {
						// 登录成功
						return null;
					} else {
						return "密码错误";
					}
				} else {
					return "用户名错误";
				}
			} else {
				return msg;
			}

		} catch (Exception e) {
			// TODO: handle exception
			return "Exception:" + e.getMessage();
		}

	}

	/**
	 * 用户注册
	 * 
	 * @param email
	 * @param pwd
	 * @param confirmPwd
	 * @return NULL means login success,other strings means error message.
	 */
	public String register(String email, String pwd, String confirmPwd) {
		try {
			ctx.beginTransaction();
			String msg = userNameAndPwdCanNotNull(email, pwd);
			if (msg == null) {
				// 用户名和密码都不为空
				// 邮箱格式正确
				if (isEmail(email)) {
					// 两次输入的密码一致
					if (isTwicePwdEqual(pwd, confirmPwd)) {
						// 用户未注册
						if (!isUserRegister(email)) {
							User registerUser = new User();
							registerUser.setEmail(email);
							registerUser.setPwd(md5(pwd));
							ctx.add(registerUser, User.class, long.class);
							ctx.commit();
						} else {
							return "用户已存在";
						}
					} else {
						return "两次输入的密码不一致";
					}
				} else {
					return "邮箱格式不正确";
				}
			} else {
				return msg;
			}
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			ctx.rollback();
		}
		return null;// 表示注册成功
	}

	/**
	 * 判读用户是否注册
	 * 
	 * @param email
	 * @return
	 */
	public boolean isUserRegister(String email) {
		try {
			QueryBuilder<User, Long> qb = ctx.getQueryBuilder(User.class,
					long.class);
			qb.where().eq("email", email);
			List<User> dbUserList = ctx.query(User.class, long.class,
					qb.prepare());
			if (dbUserList.size() != 0) {
				// 邮箱已被注册
				return true;
			}
		} catch (Exception e) {
		}
		return false;
	}

	/**
	 * 判断用户名和密码是否为空
	 * 
	 * @param userName
	 * @param pwd
	 * @return
	 */
	public String userNameAndPwdCanNotNull(String userName, String pwd) {

		if (!userName.equals("")) {
			// 用户名不为空
			if (!pwd.equals("")) {
				// 密码不为空
				return null;
			} else {
				return "密码不能为空";
			}
		} else {
			return "用户名不能为空";
		}
	}

	/**
	 * 用户登录（用户名可以是邮箱，也可以是昵称）
	 * 
	 * @param user
	 * @return NULL means login success,other strings means error message.
	 */
	public String userLogin(User user) {
		try {
			// 先对用户信息进行加密
			User loginUser = md5(user);
			// 查询数据库中是否存在该用户
			QueryBuilder<User, Long> qb = ctx.getQueryBuilder(User.class,
					long.class);
			if (loginUser.getEmail() != null) {
				// 用户以邮箱登录
				qb.where().eq("email", loginUser.getEmail());
			} else if (loginUser.getNickName() != null) {
				// 用户以昵称登录
				qb.where().eq("nickName", loginUser.getNickName());
			}
			List<User> dbUserList = ctx.query(User.class, long.class,
					qb.prepare());
			User dbUser = null;
			// 如果用户存在
			if (dbUserList.size() != 0) {
				// 因为用户名（邮箱或昵称）是惟一的，所以dbUserList中只有一个对象
				dbUser = dbUserList.get(0);
				// 如果用户密码也正确，则返回true，表示登录成功
				if (loginUser.getPwd().equals(dbUser.getPwd())) {
					return null;
				} else {
					// 密码错误
					return "Password Error";
				}
			} else {
				// 用户名错误（即用户不存在）
				return "UserName Error";
			}

		} catch (SQLException e) {
			return "Exception:" + e.getMessage();
		}
	}

	/**
	 * 用户注册
	 * 
	 * @param user
	 * @return TRUE means register successfully, FALSE means the email has been
	 *         registered
	 */
	public boolean userRegister(User user) {
		try {
			ctx.beginTransaction();
			// 查询数据库中是否存在该用户
			QueryBuilder<User, Long> qb = ctx.getQueryBuilder(User.class,
					long.class);
			if (user.getEmail() != null) {
				qb.where().eq("email", user.getEmail());
			}
			List<User> dbUserList = ctx.query(User.class, long.class,
					qb.prepare());
			// 用户未注册（即邮箱未被注册）
			if (dbUserList.size() == 0) {
				// 先对用户信息进行加密
				User registerUser = md5(user);
				// 再进行存储
				ctx.add(registerUser, User.class, long.class);
				ctx.commit();
				return true;
			}
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			ctx.rollback();
		}
		return false;

	}

	/**
	 * 验证邮箱格式是否正确
	 * 
	 * @param email
	 * @return TRUE if the format of email is matcher
	 */
	public boolean isEmail(String email) {
		// 邮箱正确格式
		String str = "^([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)*@"
				+ "([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)+[\\.][A-Za-z]{2,3}([\\.][A-Za-z]{2})?$";
		// 正则表达式匹配
		Pattern pattern = Pattern.compile(str);
		Matcher matcher = pattern.matcher(email);
		return matcher.matches();
	}

	/**
	 * 判断两次输入的密码是否一致
	 * 
	 * @param pwd
	 * @param confirmPwd
	 * @return
	 */
	public boolean isTwicePwdEqual(String pwd, String confirmPwd) {
		// 如果两次输入密码一致，则返回true，否则返回false
		if (confirmPwd.equals(pwd)) {
			return true;
		}
		return false;
	}

	/**
	 * 使用MD5算法对用户密码进行加密
	 * 
	 * @param pwd
	 * @return encoded password
	 */
	private String md5(String pwd) {
		try {
			byte[] input = pwd.getBytes();
			// 获得MD5摘要算法的 MessageDigest 对象
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			// 使用指定的字节更新摘要
			md5.update(input);
			// 获得密文
			byte[] output = md5.digest();
			int i;
			StringBuffer buf = new StringBuffer("");
			for (int j = 0; j < output.length; j++) {
				i = output[j];
				if (i < 0)
					i += 256;
				if (i < 16)
					buf.append("0");
				buf.append(Integer.toHexString(i));
			}
			// 加密后的用户密码（32位加密）
			String encodePwd = buf.toString();

			return encodePwd;

		} catch (Exception e) {
			// 加密失败
			return null;
		}

	}

	/**
	 * 使用MD5算法对用户密码进行加密
	 * 
	 * @param user
	 * @return
	 */
	private User md5(User user) {
		try {
			// 获取用户密码
			String pwd = user.getPwd();
			byte[] input = pwd.getBytes();
			// 获得MD5摘要算法的 MessageDigest 对象
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			// 使用指定的字节更新摘要
			md5.update(input);
			// 获得密文
			byte[] output = md5.digest();
			int i;
			StringBuffer buf = new StringBuffer("");
			for (int j = 0; j < output.length; j++) {
				i = output[j];
				if (i < 0)
					i += 256;
				if (i < 16)
					buf.append("0");
				buf.append(Integer.toHexString(i));
			}
			// 加密后的用户密码（32位加密）
			String encodePwd = buf.toString();
			user.setPwd(encodePwd);

			return user;

		} catch (Exception e) {
		}

		return user;
	}
	
	/**
	 * 根据用户名（邮箱或昵称）获取用户信息
	 * @param userName
	 * @return
	 */
	public User getUserInfo(String userName) {
		try {
			QueryBuilder<User, Long> qb=ctx.getQueryBuilder(User.class, long.class);
			//如果用户名是邮箱
			if(isEmail(userName)){
				qb.where().eq("email", userName);
			}else {
				//不是邮箱，即是昵称
				qb.where().eq("nickName", userName);
			}
			List<User> dbUserList=ctx.query(User.class, long.class,qb.prepare());	
			User user=dbUserList.get(0);
			return user;
			
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
		
	}
	
	/**
	 * 设置个人信息：昵称、身高、体重、性别、出生日期
	 * 
	 * @param loginUser
	 * @return
	 */
	public void setUserInfo(User loginUser) {

		try {
			ctx.beginTransaction();
			// 获取当前用户的信息
			User dbUser = getUserInfo(loginUser.getEmail());

			// 更新用户信息
			dbUser.setNickName(loginUser.getNickName());// 昵称
			dbUser.setHeight(loginUser.getHeight());// 身高
			dbUser.setWeight(loginUser.getWeight());// 体重
			dbUser.setGender(loginUser.getGender());// 性别
			dbUser.setBirthDate(loginUser.getBirthDate());// 出生日期

			ctx.update(dbUser, User.class, long.class);
			ctx.commit();

		} catch (Exception e) {
		} finally {
			ctx.rollback();
		}
	}

}
